#include "myhead.h"
#include "modul.h"
#include "cJSON.h"
#include "ui.h"

int g_beepa_onff;

char g_sky_buf[20000] = {0};//天气有关信息
char g_sky_time[120];//时间
char g_sky_area[120];//地区
char g_sky_sky[120];//天气
int g_sky_oc;//温度

char g_nowtime[50];
struct tm *g_timeinfo;
int g_hour;
int g_min;
int g_sec;

/*************************************************************
蜂鸣器模块
**************************************************************/
void *beebp_ffb(void *agr)
{
	//蜂鸣器
	int beep_fd = open(FILE_DEV, O_RDWR);
	if(beep_fd < 0)
	{
		printf("open failure\n");
	}


	while(1)
	{
		ioctl(beep_fd, GEC6818_BEEP_ON);
		sleep(1);
		ioctl(beep_fd, GEC6818_BEEP_OFF);
		sleep(1);
		if(g_beepa_onff == 1) 
		{
			ioctl(beep_fd, GEC6818_BEEP_OFF);
			usleep(500);
			close(beep_fd);
			break;
		}
	}
}

/*************************************************************
天气模块：有日期与时间，城市，今日天气，今日温度
**************************************************************/
int MicroWeather(void)
{
	int tcpsock;
	int ret;
	char ip[20]={0};
	char rbuf[20000]={0};
	char buf[20000]={0};
	
	//定义ipv4地址结构体变量
	struct sockaddr_in bindaddr;
	bzero(&bindaddr,sizeof(bindaddr));
	bindaddr.sin_family=AF_INET; //地址协议
	bindaddr.sin_addr.s_addr=htonl(INADDR_ANY);
	bindaddr.sin_port=htons(5548);  //客户端端口号
	
	//获取你要访问的http服务器ip地址
	//http没有加密的   https在http的基础上添加了加密层
	//ali-weather.showapi.com:万维易源网址地址
	struct hostent *p=gethostbyname("ali-weather.showapi.com"); //天气预报的网址
	//获取IP地址
	struct in_addr *q=(struct in_addr *)(*(p->h_addr_list));
	strcpy(ip,inet_ntoa(*q));
	
	//定义ipv4地址结构体变量存放服务器的ip和端口号
	struct sockaddr_in serveraddr;
	bzero(&serveraddr,sizeof(serveraddr));
	serveraddr.sin_family=AF_INET;
	serveraddr.sin_addr.s_addr=inet_addr(ip); //http服务器的ip
	serveraddr.sin_port=htons(80);  //http协议,端口默认就是80
	
	//创建tcp套接字 --》买手机
	tcpsock=socket(AF_INET,SOCK_STREAM,0);
	if(tcpsock==-1)
	{
		perror("创建tcp套接字失败了!\n");
		return -1;
	}
	
	//取消端口绑定限制
	int on=1; //非零
	setsockopt(tcpsock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
	
	//绑定ip和端口号 --》绑定手机号
	ret=bind(tcpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
	if(ret==-1)
	{
		perror("绑定ip和端口号失败了!\n");
		return -1;
	}
	
	//连接服务器 --》拨号
	ret=connect(tcpsock,(struct sockaddr *)&serveraddr,sizeof(serveraddr));
	if(ret==-1)
	{
		perror("连接服务器失败了!\n");
		return -1;
	}
	
	//拼接字符串得到完整的http请求
	char *httprequest="GET /hour24?area=%E5%B9%BF%E5%B7%9E&data=20240829 HTTP/1.1\r\n"
					  "Host: ali-weather.showapi.com\r\n"
					  "Authorization: APPCODE 3c6899409aa6495ca1e505940aae56e4\r\n\r\n";
	//发送刚才的请求
	send(tcpsock,httprequest,strlen(httprequest),0);
	
	//接收http服务器回复的应答信息
	recv(tcpsock,rbuf,20000,0);
	//printf("天气预报网址给我回复: %s\n",rbuf);

	char *json_start = strchr(rbuf, '{');
    if (json_start != NULL) 
	{
        // 计算 '{' 之后剩余的数据长度
        size_t remaining_length = strlen(json_start);

        // 将 '{' 之后的内容移动到数组的开头
        memmove(buf, json_start, remaining_length + 1); // +1 为了包括字符串结束符 '\0'

    }

	//printf("天气预报网址给我回复: %s\n",buf);

	//第一步：把字符串格式的json数据转换成链表存放
    cJSON *data = cJSON_Parse(buf);
	cJSON *obj1 = cJSON_GetObjectItem(data,"showapi_res_body");
	cJSON *obj2 = cJSON_GetObjectItem(obj1,"hourList");
	cJSON *obj3 = cJSON_GetArrayItem(obj2,23);
	cJSON *obj4 = cJSON_GetObjectItem(obj3,"time");//获取当前日期与时间
	cJSON *obj5 = cJSON_GetObjectItem(obj3,"area");//获取城市信息
	cJSON *obj6 = cJSON_GetObjectItem(obj3,"weather");//获取天气
	cJSON *obj7 = cJSON_GetObjectItem(obj3,"temperature");//获取温度

	printf("当前日期与时间:%s\n",obj4->valuestring);
	printf("城市:%s \n",obj5->valuestring);
	printf("今日天气:%s\n",obj6->valuestring);
	printf("今日温度:%s\n",obj7->valuestring);
	// printf("温馨提醒:天气好就赶紧约会咯,天气不好就在家敲代码咯\n");
	strcpy(g_sky_time,obj4->valuestring);
	strcpy(g_sky_area,obj5->valuestring);
	strcpy(g_sky_sky,obj6->valuestring);
	g_sky_oc = (int)obj7->valuestring;


	
	//关闭套接字
	close(tcpsock);
}

// int main()
// {
// 	//不使用获取天气会报错
// 	MicroWeather();
//     return 0;
// }

/*************************************************************
时间模块：有日期与时间
**************************************************************/
void gettime(lv_timer_t *arg)
{
	time_t now;
	
	time(&now);
	g_timeinfo = localtime(&now);
	snprintf(g_nowtime, 50, "%02d:%02d:%02d",((g_timeinfo->tm_hour - 1) % 12) + 1,g_timeinfo->tm_min, g_timeinfo->tm_sec);
	//printf("%s",g_nowtime);
	sleep(1);
	g_hour = ((g_timeinfo->tm_hour - 1) % 12)+1;
	g_min = g_timeinfo->tm_min;
	g_sec = g_timeinfo->tm_sec;
	// printf("%d\n",g_sec);
	
	lv_label_set_text(ui_PARLabel5, g_nowtime);
}

// int main()
// {
// 	//不使用获取天气会报错
// 	gettime(2);
// 	MicroWeather();
//     return 0;
// }